package com.dsj.dao;

import com.dsj.entity.ProductEntity;
import com.dsj.util.DBConnection;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ProductDao {
    private Connection connection = null;
    private DBConnection jdbc = null;

    public ProductDao() {
        jdbc = new DBConnection();
        connection = jdbc.connetction;  //获取了数据库连接对象
    }

    //查询所有的商品信息，并返回查询结果
    public List<ProductEntity> selectAllProduct() {
        //数据库的语句对象(进行数据库的增删改查操作）
        Statement st = null;
        //结果集对象（存放查询的结果）
        ResultSet rs = null;
        List list = new ArrayList<ProductEntity>();

        String sql = "select * from tb_product order by id DESC";
        //String sql1 = "select * from tb_product where discount =“ + a + " order by id DESC";
        try {
            st = connection.createStatement();  //创建语句对象 SQL注入的风险
            rs = st.executeQuery(sql);    //执行查询，并将查询结果保存到结果集对象rs
            list = Rs2List(rs);
        } catch (SQLException e) {
            System.out.println("数据库操作失败");
        }
        return list;
    }

    /**
     * 以商品是否为新品、特价为条件查询商品信息
     * 新品：discount字段值为0
     * 特价商品：discount字段值为1
     */
    public List<ProductEntity> selectProductByDiscount(int discount) {
        //数据库的语句对象(进行数据库的增删改查操作）
        PreparedStatement ps = null;
        //结果集对象（存放查询的结果）
        ResultSet rs = null;
        //存放查询结果的集合
        List list = new ArrayList<ProductEntity>();
        try {
            //使用PreparedStatement对象进行预编译，提高效率
            String sql = "select * from tb_product where discount =? order by id DESC";
            ps = connection.prepareStatement(sql);
            ps.setInt(1, discount);
            rs = ps.executeQuery();
            list = Rs2List(rs);
        } catch (SQLException e) {
            System.out.println("数据库操作失败");
        }
        return list;
    }

    //以商品的名称为搜索条件查询所有商品信息
    public List<ProductEntity> selectProductByName(String name) {
        //数据库的语句对象(进行数据库的增删改查操作）
        PreparedStatement ps = null;
        //结果集对象（存放查询的结果）
        ResultSet rs = null;
        //存放查询结果的集合
        List list = new ArrayList<ProductEntity>();
        try {
            //使用PreparedStatement对象进行预编译，提高效率
            String sql = "select * from tb_product where name like ? order by id DESC";
            ps = connection.prepareStatement(sql);
            ps.setString(1, "%" + name + "%");
            rs = ps.executeQuery();
            list = Rs2List(rs);
        } catch (SQLException e) {
            System.out.println("数据库操作失败");
        }
        return list;
    }


    /**
     * ResultSet 类型数据转制为List，其中元素为ProductEntity对象
     */
    public List<ProductEntity> Rs2List(ResultSet rs) {
        List list = new ArrayList<ProductEntity>();
        try {
            while(rs.next()) {
                ProductEntity e = new ProductEntity();  //商品记录将保存在ProductEntity对象中，并返回给前端
                e.setName(rs.getString("name"));
                e.setMarketPrice(rs.getDouble("market_price"));
                e.setDescription(rs.getString("description"));
                e.setPicture(rs.getString("picture"));
                e.setDiscount(rs.getString("discount"));
                e.setProducingArea(rs.getString("producing_area"));
                e.setCreateTime(rs.getTimestamp("create_time"));
                e.setSellPrice(rs.getDouble("sell_price"));
                e.setCategoryMainId(rs.getInt("category_main_id"));
                e.setCategoryBranchId(rs.getInt("category_branch_id"));
                e.setProductAmount(rs.getInt("product_amount"));
                e.setId(rs.getInt("id"));
                list.add(e);
            }
        } catch (SQLException e) {
            System.out.println("数据库操作失败");
        }
        return list;
    }

    /**
     * 根据商品id查询商品信息
     * @param id 商品id
     * @return 商品信息实体对象
     */
    public ProductEntity selectOneProduct(int id) {
        // 创建一个商品实体类对象
        ProductEntity e = new ProductEntity();
        try {
            // 设置SQL语句
            String sql = "select * from tb_product where id =?";
            // 创建PreparedStatement对象，并传入SQL语句
            PreparedStatement ps = connection.prepareStatement(sql);
            // 设置参数
            ps.setInt(1, id);
            // 执行查询
            ResultSet rs = ps.executeQuery();
            // 如果查询结果存在下一条记录
            if (rs.next()) {
                // 从结果集中获取产品ID，并赋值给e的id属性
                e.setId(rs.getInt("id"));
                // 从结果集中获取产品名称，并赋值给e的name属性
                e.setName(rs.getString("name"));
                // 从结果集中获取产品市场价，并赋值给e的marketPrice属性
                e.setMarketPrice(rs.getDouble("market_price"));
                // 从结果集中获取产品描述，并赋值给e的description属性
                e.setDescription(rs.getString("description"));
                // 从结果集中获取产品图片，并赋值给e的picture属性
                e.setPicture(rs.getString("picture"));
                // 从结果集中获取产品折扣，并赋值给e的discount属性
                e.setDiscount(rs.getString("discount"));
                // 从结果集中获取产品产地，并赋值给e的producingArea属性
                e.setProducingArea(rs.getString("producing_area"));
                // 从结果集中获取产品创建时间，并赋值给e的createTime属性
                e.setCreateTime(rs.getTimestamp("create_time"));
                // 从结果集中获取产品售价，并赋值给e的sellPrice属性
                e.setSellPrice(rs.getDouble("sell_price"));
                // 从结果集中获取产品所属的主要类别ID，并赋值给e的categoryMainId属性
                e.setCategoryMainId(rs.getInt("category_main_id"));
                // 从结果集中获取产品所属的子类别ID，并赋值给e的categoryBranchId属性
                e.setCategoryBranchId(rs.getInt("category_branch_id"));
                // 从结果集中获取产品数量，并赋值给e的产品Amount属性
                e.setProductAmount(rs.getInt("product_amount"));
            }
        } catch (SQLException ex) {
            // 打印出异常的堆栈信息
            ex.printStackTrace();
        }
        // 返回商品实体类对象e
        return e;
    }

    /**
     * 根据商品id查询商品名称
     * @param id 商品id
     * @return 商品名称
     */
    public String selectOneNameByProductId(int id ) {
        String name = null;
        try {
            // 设置SQL语句
            String sql = "select name from tb_product where id =?";
            // 创建PreparedStatement对象，并传入SQL语句
            PreparedStatement ps = connection.prepareStatement(sql);
            // 设置参数
            ps.setInt(1, id);
            // 执行查询
            ResultSet rs = ps.executeQuery();
            // 如果查询结果存在下一条记录
            if (rs.next()) {
                // 从结果集中获取产品名称，并赋值给name属性
                name = rs.getString("name");
            }
        } catch (SQLException ex) {
            // 打印出异常的堆栈信息
            ex.printStackTrace();
        }
        return name;
    }


    /**
     * 根据商品id修改商品的销售数量
     */
    public boolean updateProductAmount(int id, int amount) {
        boolean flag = false;
        try {
            // 设置SQL语句
            String sql = "update tb_product set product_amount = product_amount + ? where id =?";
            // 创建PreparedStatement对象，并传入SQL语句
            PreparedStatement ps = connection.prepareStatement(sql);
            // 设置参数
            ps.setInt(1, amount);
            ps.setInt(2, id);
            // 执行修改
            int i = ps.executeUpdate();
            if (i > 0) {
                flag = true;
            }
        } catch (SQLException ex) {
            // 打印出异常的堆栈信息
            ex.printStackTrace();
        }
        return flag;
    }
}
